# 加密函数JWT这个比较常用
import jwt
from jwt import PyJWTError
from comment.utils import const
from flask import current_app
from comment.model.user import User
from datetime import datetime, timedelta


def generate_tokens(uid):
    """
    根据已经登陆之后的用户ID，生成Token
    :param uid:用户ID
    :return:
    """
    payload = {
        'id': uid,
        # exp代表token有效时间，而且必须是标准时间
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    # jwt.encode加密
    # 参数1，payload是一个字典包括加密用户ID和有效时间，参数2：密钥，参数3：秘密算法
    s = jwt.encode(payload=payload, key=const.SECRET_KEY, algorithm="HS256")
    # 生成一个token
    return s


def verify_tokens(token_str):
    """
    验证token，并且验证成功后，返回用户ID
    :param token_str:
    :return:
    """
    try:
        # 本质上就是一个解密的过程
        data = jwt.decode(token_str, key=const.SECRET_KEY, algorithms="HS256")
    except PyJWTError as e:
        current_app.logger.info(e)  # 日志上记录
        return {'message': 'token 验证失败'}, 401
    # 如果token验证失败，还需要看看当前用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status != 0:
        return {"massage": "数据库中用户状态过期"}
    return {'id': user.id}
